package com.huahua.bigdata.spark.rdd.instance;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;

import java.util.Arrays;
import java.util.List;

public class Spark01_Env {
    public static void main(String[] args) {
        final SparkConf conf = new SparkConf();
        conf.setMaster("local");
        conf.setAppName("spark");
        // TODO 构建Spark的运行环境
//        JavaSparkContext jsc = new JavaSparkContext("local", "spark");
        JavaSparkContext jsc = new JavaSparkContext(conf);

//        // TODO 构建RDD数据处理模型
//        //   利用环境对象对接内存数据源, 构建RDD对象
//        List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
//        // parallelize(并行)方法可以传递参数: 集合
//        //    RDD数据模型存在泛型
//        final JavaRDD<String> rdd = jsc.parallelize(names);


//        // TODO 构建RDD数据处理模型
//        //    利用环境对象对接磁盘数据(文件), 构建RDD对象
//        // textFile方法可以传递一个参数: 文件路径
//        //      1. 第二个参数: minPartitions(最小分区数)
//        //         参数可以不需要传递的, 那么Spark会采用默认值
//        //              minPartitions = math.min(defaultParallelism, 2)
//        //      2. 使用配置参数: spark。default.parallelism => 4 => math.min(参数,2)
//        //      3. 采用环境默认总核值 => math.min(总核数, 2)
//        // TODO Spark框架基于MR开发的
//        //      Spark框架文件的操作没有自己的实现的. 采用MR库(Hadoop)来实现
//        //      当前读取文件的切片数量不是由Spark决定的,而是由Hadoop决定
//        // Hadoop切片规则:
//        //      totalsize: 3 byte
//        //      goalsize :  3 / 2 => 1 byte
//        //      part-num : 3 / 1 => 3
//        JavaRDD<String> rdd = jsc.textFile("E:\\test\\test\\bigdata-classes241101\\data\\test.txt");
//
//        final List<String> collect = rdd.collect();
//        collect.forEach(System.out::println);

        // TODO kafka可以将数据进行分片(减少规模), 也称之为分区, 这个分区操作是底层完成的。
        //     local环境中,分区数量和环境核数相关, 但是一般不推荐
        //     分区数量需要手动设定
        //            1. 优先使用方法参数
        //            2. 使用配置参数: spark.default.parallelism
        //            3. 采用环境默认值
        List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
        // parallelize方法可以传递2个参数的
        //     第一个参数表示对接的数据源集合
        //     第二个参数表示切片(分区)的数量, 可以不需要指定, spark会采用默认值进行分区(切片)
        // TODO Spark分区数据的存储基本原则: 平均分
        //
        final JavaRDD<String> rdd = jsc.parallelize(names, 3);
        // TODO 将数据模型分区后的数据保存到磁盘文件中
        //      saveAsTextFile方法可以传递一个参数, 表示输出的文件路径, 路径可以为绝对路径, 也可以为相对路径
        //      IDEA默认的相对路径以项目的根路径为准
        rdd.saveAsTextFile("out");

        // TODO 释放资源
        jsc.close();
    }
}
